<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>

<body>

</body>
<script>
    
    //直接调用add函数即可

    /**
    *
    *  把数组中的非0的值排在数组前面，0排在后面********(移0操作)
    *  Create By YangHuiJun  
    *  @param   arr 需要移0的数组
    *
    */
    removeZero = arr => {
        //设置正则表达式，提取出非0的数
        let reg = /([12]0\d\d)|([1-9]\d\d)|([1-9]\d)|[248]/g;
        arr = arr.join(",").match(reg);
        //当原数组所有的值为0时，正则匹配返回null,则需对数组重新赋值
        if (arr == null) {
            arr = [0, 0, 0, 0];
        }
        //获取返回后的数组的长度，实际是返回非0数据的个数
        let length = arr.length;
        //当返回非0数据的个数不为4时，即原数组的值有0存在，则需对当前数组末尾补0，实现把原数组的0移到数组的后面
        if (length != 4) {
            for (let i = length; i < 4; i ++) {
                arr[i] = 0;
            }
        }
        //由于正则匹配返回的值是字符串，需要进行类型转换，以便计算
        for (let i in arr) {
            arr[i] = parseInt(arr[i]);
        }
        //返回处理后的数组
        return arr;
    }

    /**
    *
    *  对数组中的值进行计算
    *  Create By YangHuiJun
    *  @param arr 需要进行计算的数组
    *
    */
    add = arr => {
        //对数组进行移0处理
        arr = removeZero(arr);
        //遍历数组进行计算
        //当arr[index] = 0时，由于上面进行过移0操作，所以排在其后面的值都为0，则不用再继续遍历计算
        for (let index = 0; index < 4 && arr[index] != 0; index ++) {
            //如果相邻两个数相等且不为0，则把他们相加，并把和放在后面的位置，前面的位置重新赋值为0，再把下标往后移一位
            if (arr[index] == arr[index + 1] && arr[index] != 0) {
                arr[index + 1] *= 2;
                arr[index] = 0;
                index += 1;
                
            }
        }
        //对相加后的数组移0
        arr = removeZero(arr);
        return arr;
    }

</script>

</html>